package com.bdqn.xml;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

/**
 * XML解析器
 *
 * @author LILIBO
 * @since 2024/6/28
 */
public class Test01XmlParser {

    public static void main(String[] args) {
        // 创建XML文档解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            // 获得XML文档解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析XML文件
            Document document = builder.parse("src/main/java/收藏信息.xml");
            // 通过标签名获取节点集合
            NodeList nodeList = document.getElementsByTagName("Brand");
            // 循环节点列表
            for (int i = 0; i < nodeList.getLength(); i++) {
                // 获取节点
                Node node = nodeList.item(i);
                // 将节点转换为元素
                Element element = (Element) node;
                String tagName = element.getTagName(); // 获取节点名称
                String name = element.getAttribute("name"); // 获取节点属性
                System.out.println(tagName + "节点元素：name=" + name);
                // 获取子节点集合
                NodeList childNodes = element.getChildNodes();
                for (int j = 0; j < childNodes.getLength(); j++) {
                    // 获取节点
                    Node childNode = childNodes.item(j);
                    short nodeType = childNode.getNodeType();
                    System.out.println("第" + (j + 1) + "个子节点类型：" + nodeType);
                    // 判断节点是否是元素节点
                    if (nodeType == Node.ELEMENT_NODE) {
                        // 将节点转换为元素
                        Element childElement = (Element) childNode;
                        String childTagName = childElement.getTagName(); // 获取节点名称
                        String childName = childElement.getAttribute("name"); // 获取节点属性
                        System.out.println("\t" + childTagName + "子节点元素：name=" + childName);
                    } else if (nodeType == Node.TEXT_NODE) { // 这是文本节点
                        String nodeValue = childNode.getNodeValue();
                        System.out.println("文本：[" + nodeValue + "]");
                    }
                }
            }
        } catch (ParserConfigurationException | IOException | SAXException e) {
            throw new RuntimeException(e);
        }
    }

}
